๐๏ธGitะฏัะฐ๐๏ธ
Node / meshtastic / Meshtastic-Android / files / core / common / src / commonMain / kotlin / org / meshtastic / core / common / util / Formatter.kt
Displaying Raw โข Download
core/common/src/commonMain/kotlin/org/meshtastic/core/common/util/Formatter.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 4.74 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.common.util
T8b949e/**
* Pure-Kotlin multiplatform string formatting.
*
* Implements the subset of Java's `String.format()` patterns used in this codebase:
* - `%s`, `%d` โ positional or sequential string/integer
* - `%N$s`, `%N$d` โ explicit positional string/integer
* - `%N$.Nf`, `%.Nf` โ float with decimal precision
* - `%x`, `%X`, `%08x` โ hexadecimal (lower/upper, optional zero-padded width)
* - `%%` โ literal percent
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLoopWithTooManyJumpStatementsTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffformatStringTb4b4b4(Te6edf3patternTb4b4b4: Tffa657StringTb4b4b4, Tff7b72vararg Te6edf3argsTb4b4b4: Tffa657Any?Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3buildString Tb4b4b4{
Tff7b72var Te6edf3i Tff7b72= T79c0ff0
Tff7b72var Te6edf3autoIndex Tff7b72= T79c0ff0
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3patternTff7b72[Te6edf3iTff7b72] Tff7b72!Tff7b72= Ta5d6ff'%'Tb4b4b4) Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3patternTff7b72[Te6edf3iTff7b72]Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tff7b72continue
Tb4b4b4}
Te6edf3iTff7b72+Tff7b72+ T8b949e// skip '%'
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72>Tff7b72= Te6edf3patternTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72break
T8b949e// Literal %%
Tff7b72if Tb4b4b4(Te6edf3patternTff7b72[Te6edf3iTff7b72] Tff7b72=Tff7b72= Ta5d6ff'%'Tb4b4b4) Tb4b4b4{
Te6edf3appendTb4b4b4(Ta5d6ff'%'Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tff7b72continue
Tb4b4b4}
T8b949e// Parse optional positional index (N$)
Tff7b72var Te6edf3explicitIndexTb4b4b4: Tffa657Int? Tff7b72= Tff7b72null
Tff7b72val Te6edf3startPos Tff7b72= Te6edf3i
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3isDigitTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3iTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72] Tff7b72=Tff7b72= Ta5d6ff'$' Tff7b72&Tff7b72& Te6edf3i Tff7b72> Te6edf3startPosTb4b4b4) Tb4b4b4{
Te6edf3explicitIndex Tff7b72= Te6edf3patternTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3startPosTb4b4b4, Te6edf3iTb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Tff7b72- T79c0ff1 T8b949e// 1-indexed โ 0-indexed
Te6edf3iTff7b72+Tff7b72+ T8b949e// skip '$'
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3i Tff7b72= Te6edf3startPos T8b949e// rewind โ digits are part of width/precision, not positional index
Tb4b4b4}
T8b949e// Parse optional flags (zero-pad)
Tff7b72var Te6edf3zeroPad Tff7b72= Tff7b72false
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72] Tff7b72=Tff7b72= Ta5d6ff'0'Tb4b4b4) Tb4b4b4{
Te6edf3zeroPad Tff7b72= Tff7b72true
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Parse optional width
Tff7b72var Te6edf3widthTb4b4b4: Tffa657Int? Tff7b72= Tff7b72null
Tff7b72val Te6edf3widthStart Tff7b72= Te6edf3i
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3isDigitTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3iTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72> Te6edf3widthStartTb4b4b4) Tb4b4b4{
Te6edf3width Tff7b72= Te6edf3patternTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3widthStartTb4b4b4, Te6edf3iTb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tb4b4b4}
T8b949e// Parse optional precision (.N)
Tff7b72var Te6edf3precisionTb4b4b4: Tffa657Int? Tff7b72= Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72] Tff7b72=Tff7b72= Ta5d6ff'.'Tb4b4b4) Tb4b4b4{
Te6edf3iTff7b72+Tff7b72+ T8b949e// skip '.'
Tff7b72val Te6edf3precStart Tff7b72= Te6edf3i
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3patternTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3patternTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3isDigitTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3iTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72> Te6edf3precStartTb4b4b4) Tb4b4b4{
Te6edf3precision Tff7b72= Te6edf3patternTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3precStartTb4b4b4, Te6edf3iTb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e// Parse conversion character
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72>Tff7b72= Te6edf3patternTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72break
Tff7b72val Te6edf3conversion Tff7b72= Te6edf3patternTff7b72[Te6edf3iTff7b72]
Te6edf3iTff7b72+Tff7b72+
Tff7b72val Te6edf3argIndex Tff7b72= Te6edf3explicitIndex Tff7b72?: Te6edf3autoIndexTff7b72+Tff7b72+
Tff7b72val Te6edf3arg Tff7b72= Te6edf3argsTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3argIndexTb4b4b4)
Tff7b72when Tb4b4b4(Te6edf3conversionTb4b4b4) Tb4b4b4{
Ta5d6ff's' Tff7b72-Tff7b72> Te6edf3appendTb4b4b4(Te6edf3argTff7b72?.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ffnullTa5d6ff"Tb4b4b4)
Ta5d6ff'd' Tff7b72-Tff7b72> Te6edf3appendTb4b4b4(Tb4b4b4(Te6edf3arg Tff7b72as? Te6edf3NumberTb4b4b4)Tff7b72?.Te6edf3toLongTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72?: Te6edf3argTff7b72?.Te6edf3toStringTb4b4b4(Tb4b4b4) Tff7b72?: Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4)
Ta5d6ff'f' Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3value Tff7b72= Tb4b4b4(Te6edf3arg Tff7b72as? Te6edf3NumberTb4b4b4)Tff7b72?.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0.0
Tff7b72val Te6edf3places Tff7b72= Te6edf3precision Tff7b72?: Te6edf3DEFAULT_FLOAT_PRECISION
Te6edf3appendTb4b4b4(Te6edf3NumberFormatterTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3valueTb4b4b4, Te6edf3placesTb4b4b4)Tb4b4b4)
Tb4b4b4}
Ta5d6ff'x'Tb4b4b4,
Ta5d6ff'X'Tb4b4b4,
Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3value Tff7b72= Tb4b4b4(Te6edf3arg Tff7b72as? Te6edf3NumberTb4b4b4)Tff7b72?.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0L
T8b949e// Mask to 32 bits when the original arg fits in an Int to match unsigned behaviour.
Tff7b72val Te6edf3masked Tff7b72= Tff7b72if Tb4b4b4(Te6edf3arg Tff7b72is Tffa657IntTb4b4b4) Te6edf3value Te6edf3and Te6edf3INT_MASK Tff7b72else Tff7b72value
Tff7b72var Te6edf3hex Tff7b72= Te6edf3maskedTb4b4b4.Te6edf3toStringTb4b4b4(Te6edf3HEX_RADIXTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3conversion Tff7b72=Tff7b72= Ta5d6ff'X'Tb4b4b4) Te6edf3hex Tff7b72= Te6edf3hexTb4b4b4.Te6edf3uppercaseTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3padChar Tff7b72= Tff7b72if Tb4b4b4(Te6edf3zeroPadTb4b4b4) Ta5d6ff'0' Tff7b72else Ta5d6ff' '
Tff7b72val Te6edf3padWidth Tff7b72= Te6edf3width Tff7b72?: T79c0ff0
Te6edf3appendTb4b4b4(Te6edf3hexTb4b4b4.Te6edf3padStartTb4b4b4(Te6edf3padWidthTb4b4b4, Te6edf3padCharTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
T8b949e// Unknown conversion โ reproduce original token
Te6edf3appendTb4b4b4(Ta5d6ff'%'Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3explicitIndex Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3appendTb4b4b4(Ta5d6ff"Tffd700${Te6edf3explicitIndex Tff7b72+ T79c0ff1Tffd700}$Ta5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3zeroPadTb4b4b4) Te6edf3appendTb4b4b4(Ta5d6ff'0'Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3width Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3appendTb4b4b4(Te6edf3widthTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3precision Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff.Tffd700$Te6edf3precisionTa5d6ff"Tb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3conversionTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3DEFAULT_FLOAT_PRECISION Tff7b72= T79c0ff6
Tff7b72private Tff7b72const Tff7b72val Te6edf3HEX_RADIX Tff7b72= T79c0ff1T79c0ff6
Tff7b72private Tff7b72const Tff7b72val Te6edf3INT_MASK Tff7b72= T79c0ff0Te6edf3xFFFFFFFFL
Served by rngit 1.5.0 - Generated in 0.06s